package net.sf.l2j.gameserver.model.actor.instance;

import net.sf.l2j.Config;
import net.sf.l2j.gameserver.model.L2Clan;
import net.sf.l2j.gameserver.network.SystemMessageId;
import net.sf.l2j.gameserver.network.serverpackets.ActionFailed;
import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
import net.sf.l2j.gameserver.network.serverpackets.WareHouseDepositList;
import net.sf.l2j.gameserver.network.serverpackets.WareHouseWithdrawalList;
import net.sf.l2j.gameserver.templates.chars.L2NpcTemplate;
import net.sf.l2j.gameserver.util.Util;

/**
 * @author  l3x
 */
public class L2CastleWarehouseInstance extends L2NpcInstance
{
	protected static final int COND_ALL_FALSE = 0;
	protected static final int COND_BUSY_BECAUSE_OF_SIEGE = 1;
	protected static final int COND_OWNER = 2;
	
    public L2CastleWarehouseInstance(int objectId, L2NpcTemplate template)
    {
        super(objectId, template);
    }
    
	@Override
	public boolean isWarehouse()
	{
		return true;
	}
	
    private void showRetrieveWindow(L2PcInstance player)
    {
        player.sendPacket(ActionFailed.STATIC_PACKET);
        player.setActiveWarehouse(player.getWarehouse());

        if (player.getActiveWarehouse().getSize() == 0)
        {
            player.sendPacket(SystemMessageId.NO_ITEM_DEPOSITED_IN_WH);
            return;
        }

        player.sendPacket(new WareHouseWithdrawalList(player, WareHouseWithdrawalList.PRIVATE));
    }

    private void showDepositWindow(L2PcInstance player)
    {
        player.sendPacket(ActionFailed.STATIC_PACKET);
        player.setActiveWarehouse(player.getWarehouse());
        player.tempInventoryDisable();

        player.sendPacket(new WareHouseDepositList(player, WareHouseDepositList.PRIVATE));
    }

    private void showDepositWindowClan(L2PcInstance player)
    {
        player.sendPacket(ActionFailed.STATIC_PACKET);
        if (player.getClan() != null)
        {
            if (player.getClan().getLevel() == 0)
                player.sendPacket(SystemMessageId.ONLY_LEVEL_1_CLAN_OR_HIGHER_CAN_USE_WAREHOUSE);
            else
            {
                if ((player.getClanPrivileges() & L2Clan.CP_CL_VIEW_WAREHOUSE) != L2Clan.CP_CL_VIEW_WAREHOUSE)
                    player.sendPacket(SystemMessageId.ONLY_CLAN_LEADER_CAN_RETRIEVE_ITEMS_FROM_CLAN_WAREHOUSE);
                
                player.setActiveWarehouse(player.getClan().getWarehouse());
                player.tempInventoryDisable();
                player.sendPacket(new WareHouseDepositList(player, WareHouseDepositList.CLAN));
            }
        }
    }

    private void showWithdrawWindowClan(L2PcInstance player)
    {
        player.sendPacket(ActionFailed.STATIC_PACKET);
        if ((player.getClanPrivileges() & L2Clan.CP_CL_VIEW_WAREHOUSE) != L2Clan.CP_CL_VIEW_WAREHOUSE)
        {
        	player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_THE_RIGHT_TO_USE_CLAN_WAREHOUSE);
        	return;
        }
        else
        {
            if (player.getClan().getLevel() == 0)
                player.sendPacket(SystemMessageId.ONLY_LEVEL_1_CLAN_OR_HIGHER_CAN_USE_WAREHOUSE);
            else
            {
                player.setActiveWarehouse(player.getClan().getWarehouse());
                player.sendPacket(new WareHouseWithdrawalList(player, WareHouseWithdrawalList.CLAN));
            }
        }
    }

    @Override
    public void onBypassFeedback(L2PcInstance player, String command) 
    {
        if (player.getActiveEnchantItem() != null) 
        {
        	Util.handleIllegalPlayerAction(player, player.getName()+" tried to cheat.",Config.DEFAULT_PUNISH);
            return;
        }

        if (command.startsWith("WithdrawP"))
            showRetrieveWindow(player);
        else if (command.equals("DepositP"))
            showDepositWindow(player);
        else if (command.equals("WithdrawC"))
            showWithdrawWindowClan(player);
        else if (command.equals("DepositC"))
            showDepositWindowClan(player);
        else if (command.startsWith("Chat"))
        {
            int val = 0;
            try
            {
               val = Integer.parseInt(command.substring(5));
            }
            catch (IndexOutOfBoundsException ioobe){}
            catch (NumberFormatException nfe){}
            showChatWindow(player, val);
        }
        else
            super.onBypassFeedback(player, command);
    }

    @Override
    public void showChatWindow(L2PcInstance player, int val)
    {
        player.sendPacket( ActionFailed.STATIC_PACKET );
        String filename = "data/html/castlewarehouse/castlewarehouse-no.htm";

        int condition = validateCondition(player);
        if (condition > COND_ALL_FALSE)
        {
            if (condition == COND_BUSY_BECAUSE_OF_SIEGE)
                filename = "data/html/castlewarehouse/castlewarehouse-busy.htm";
            else if (condition == COND_OWNER)
            {
                if (val == 0)
                    filename = "data/html/castlewarehouse/castlewarehouse.htm";
                else
                    filename = "data/html/castlewarehouse/castlewarehouse-" + val + ".htm";
            }
        }

        NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
        html.setFile(filename);
        html.replace("%objectId%", String.valueOf(getObjectId()));
        html.replace("%npcname%", getName());
        player.sendPacket(html);
    }

    protected int validateCondition(L2PcInstance player)
    {
        if (getCastle() != null && getCastle().getCastleId() > 0)
        {
            if (player.getClan() != null)
            {
                if (getCastle().getSiege().getIsInProgress())
                    return COND_BUSY_BECAUSE_OF_SIEGE;
                else if (getCastle().getOwnerId() == player.getClanId())
                    return COND_OWNER;
            }
        }
        return COND_ALL_FALSE;
    }
}